[新機能] AppSync Event APIが発表されました!

[新機能] AppSync Event APIが発表されました!

Clock Icon2024.11.01

大阪オフィスの小倉です。

AppSync Event APIという機能が発表されました。

https://aws.amazon.com/jp/about-aws/whats-new/2024/10/aws-appsync-websocket-apis-web-mobile-experiences/

紹介には、リアルタイムのWeb/Mobileアプリケーションを構築するため、とありますね。

以下のAWS Blogとドキュメント、マネジメントコンソールから試してみてどんな機能なのかわかったことをまとめていこうと思います。

https://aws.amazon.com/jp/blogs/mobile/announcing-aws-appsync-events-serverless-websocket-apis/

AppSync Event APIとは?

ざっくり言うと、サーバレスなWebSocketAPIサービス、のようです。
これまではAppSync = GraphQLのマネージドサービス、という印象があったのですが、従来のGraphQLとは別タイプのAPIという分類です。
ですので、Event APIの話には、GraphQLは全く登場しません。

APIタイプ

  • GraphQL(従来のAppSync GraphQL)
  • イベント(今回発表)

作成したEvent API内のトピック(Event APIでは名前空間チャンネル:後述)を通してイベントのPub/Subが可能です。
既存の機能だと、AWS IoTのTopicを使ったPub/Subに近い印象です。
Event APIではPublishにHTTPS、SubscribeにWSSを使います。

Event APIの構成要素

上位から、以下のような構成になっています

  1. APIタイプ(イベントAPI)
  2. 名前空間
  3. チャンネル

実際にコンソールから作成しながら見ていきます

1.APIタイプ

AppSyncコンソールから作成していきます。
作成時にタイプを選択可能となっていて、従来のものはGraphQL API、今回発表されたものはEvent APIを選択します。

appsync-event-api-01.png

appsync-event-api-02.png

appsync-event-api-03.png

APIを作成すると、defaultという名前空間と、GraphQL APIと同様2つのエンドポイント(HTTP、リアルタイム)が作成されます。
APIのレベルでは、従来のGraphQL APIと同様に、利用する認証方法を複数種類設定し、その中でデフォルトの認証方法を決定します。
利用できる認証方法も同じで、以下が選択できます

  • API_KEY
  • AWS_LAMBDA
  • AWS_IAM
  • OPENID_CONNECT
  • AMAZON_COGNITO_USER_POOLS

appsync-event-api-04.png

2.名前空間

名前空間は、いわゆるトピックのプレフィックスです。コンソールからAPIを作成した際はdefault名前空間が作られます。

appsync-event-api-05.png

名前空間は複数作成でき、名前空間毎に、認証方法の上書き設定と、イベントハンドラーを設定できます

appsync-event-api-06.png

イベントハンドラー

イベントハンドラーは、イベントの送受信に対して追加のビジネスロジックを適用するための機能です。
JavaScriptで記述し、APPSYNC_JSランタイムで動作するとの事でした。
onPublishonSubscribeの二種類が存在します。

appsync-event-api-07.png

onPublishイベントハンドラー

onPublishは、イベントの送信者向けの追加ロジックです。用途として、

  • イベント送信前にイベントのフィルタリング
  • イベント送信前にエラー判定し、イベント送信者にエラーを返す
    が紹介されていました。

以下のコード例はAWS Blogに紹介されていたものを載せています

イベントのフィルタリング例

export function onPublish(ctx) {
  return ctx.events.filter(event => event.payload.odds > 0.9)
}

送信者にエラーを返す例

export function onPublish(ctx) {
  return ctx.events.map(event => {
    if (!event.payload.message) {
      return {
        ...event,
        error: 'You should always included a greeting.'
      }
    }
    return event
  })
}
onSubscribeイベントハンドラー

onSubscribeは、イベントの受信者向けの追加ロジックです。クライアントがSubscribeするタイミングで呼び出されます。
用途として、条件を満たさないSubscribeを拒否する例が挙げられています

Cognitoのユーザ名と名前が一致しない場合に拒否する

export function onSubscribe(ctx) {
  if (ctx.info.channel.path !== `/messages/inbox/${ctx.identity.username}`) {
    console.error(`user ${ctx.identity.username} tried connecting to wrong channel: ${ctx.info.channel.path}`)
    util.unauthorized()
  }
}

3.チャンネル

Publish/Subscribe先の、いわゆるトピック名の名前空間に続く部分です。
名前空間と組み合わせると、<名前空間>/<チャンネル> の形式です。

チャンネルの部分は、<名前空間>/<チャンネル階層1>/<チャンネル階層2>のように複数階層を作ることができます。
また、Subscribeする際は、ワイルドカード*も利用できます。

ドキュメントによると、
チャンネルは一時的なものであり、クライアントがチャネルを公開またはサブスクライブする必要があるときにオンデマンドで作成されます。(Google翻訳)とありました。

You can only publish and subscribe to channels that belong to a defined namespace. However, a channel is ephemeral and is created on-demand when a client needs to publish or subscribe to it.

このあたりは、事前にトピックを作成しておくAWS IoT やAmazon SNSと異なる部分になっていそうです。

https://docs.aws.amazon.com/appsync/latest/eventapi/channel-namespaces.html

Pub/Subしてみる

コンソール用意されているPub/Subエディタから動作を試すことができます。
上段がPublish、下段がSubscribeの枠ですね。

appsync-event-api-08.png

先にSubscribeしておきましょう。「接続」してから、default/channelをSubscribeします。

appsync-event-api-09.png
Publishで送信する内容をセットしてPublishすると、Subscribeで受信される様子が確認できます。

appsync-event-api-10.png

appsync-event-api-11.png

その他できること

ドキュメントから、現時点で以下が可能なようです。詳細は追って確認していこうと思います。

  • Amazon EventBridgeとの統合
  • カスタムドメインの設定
  • AWS WAFでの保護
  • CloudWatchでのロギング、モニタリング

料金

料金ページによると以下の記載がありました。
https://aws.amazon.com/appsync/pricing/?nc1=h_ls

また、AWSアカウントサインアップ後の無料利用枠もあるようです。

  • 250,000回のAPI操作
  • 600,000接続/分

まとめ

イベント駆動を支えるサービスにAppSync Event APIという新たなサービスが加わりました!
冒頭に紹介したAWS Blogの中では、連携するサービスの追加など、今後の機能追加にも言及されていたので、期待したいですね!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.